package thss.mro.parser;

import java.util.Iterator;
import java.util.Map;

import thss.mro.entity.Packet;
import thss.mro.entity.PacketField;
import thss.mro.entity.TemplateField;
import thss.mro.entity.template.ProtocolTemplate;
import thss.mro.simulate.SCPCellGenerator;
import thss.mro.simulate.SCPGenerator;
import thss.mro.util.Constants;
import thss.mro.util.QueryTester;
import thss.mro.util.Template;

/**
 * 数据包解析器（公共解析器，可用于单位为字节的数据包解析）
 */
public class BytePacketParser implements IPacketParser{

	/**
	 * 解析数据
	 * @param type	-	协议类型
	 * @param data	-	字节流
	 */
	public Packet parse(ProtocolTemplate pt, byte[] data){
		Packet pack = new Packet();
		int offset = 0;
		Map.Entry entry = null;
		Iterator it = pt.getFieldChain().entrySet().iterator();
		//循环为协议各字段生成随机数据
		while (it.hasNext()){ 
			entry = (Map.Entry)it.next();
			TemplateField tplFld = (TemplateField)entry.getValue();
			PacketField packfd = new PacketField();
			packfd.setTemplateField(tplFld);
			if(tplFld.isDynamic()){ //动态字段解析
				//获得动态字段的数量
				if(tplFld.getDynamicAttrs().getDynamicType()==Constants.FIELD_DYNAMICATTRS_TYEP_RANGE){
					//确定范围
					int dynamicNum = (data.length - offset - tplFld.getDynamicAttrs().getEndOffset())/tplFld.getLength();
					for(int i=0;i<dynamicNum;i++){//设置信元值
						byte[] value = new byte[tplFld.getLength()];
						System.arraycopy(data,offset,value,0,tplFld.getLength());
						//根据字段类型转换值
						packfd.getValueLst().add(value);
						offset += tplFld.getLength();
					}
				}
			}else{//单字段解析，设置package的字段链
				byte[] value = new byte[tplFld.getLength()];
				System.arraycopy(data,offset,value,0,tplFld.getLength());
				offset += tplFld.getLength();
				packfd.setValue(value);
			}
			pack.addField(packfd);
		}
		return pack;
	}
	
	public static void main(String[] args){
		QueryTester qt = new QueryTester();//测试对象打印
		//测试SCP解析
//		ProtocolTemplate scpHeadTpl = new Template().getTemplate(Constants.TEMPLATE_ID_SCP_HEAD);
//		ProtocolTemplate scpBodyTpl = new Template().getTemplate(Constants.TEMPLATE_ID_SCP_BODY);
//		byte[] scpData = new SCPGenerator().getData();
//		byte[] scpHeadData = new byte[12];
//		byte[] scpBodyData = new byte[scpData.length-12];
//		System.arraycopy(scpData, 0, scpHeadData, 0, 12);
//		System.arraycopy(scpData, 12, scpBodyData, 0, scpData.length-12);
//		Packet scpHeadPack = new BytePacketParser().parse(scpHeadTpl, scpHeadData);
//		Packet scpBodyPack = new BytePacketParser().parse(scpBodyTpl, scpBodyData);
//		qt.parseObject(scpBodyPack, 5);
		//测试SCPCell解析
		ProtocolTemplate scpCellHeadTpl = new Template().getTemplate(Constants.TEMPLATE_ID_SCPCELL_HEAD);
		ProtocolTemplate scpCellBodyTpl1 = new Template().getTemplate(Constants.TEMPLATE_ID_SCPCELL_BODY+10001);
		byte[] scpCellData = new SCPCellGenerator().getData();
		qt.parseObject(scpCellData, 5);
		byte[] scpCellHeadData = new byte[4];
		byte[] scpCellBodyData = new byte[scpCellData.length-4];
		System.arraycopy(scpCellData, 0, scpCellHeadData, 0, 4);
		System.arraycopy(scpCellData, 4, scpCellBodyData, 0, scpCellData.length-4);
		Packet scpCellHeadPack = new BytePacketParser().parse(scpCellHeadTpl, scpCellHeadData);
		Packet scpCellBodyPack1 = new BytePacketParser().parse(scpCellBodyTpl1, scpCellBodyData);
		qt.parseObject(scpCellHeadPack, 5);
		qt.parseObject(scpCellBodyPack1, 5);
	}
	
//	
//	public static void main(String[] args){
//
//		QueryTester qt = new QueryTester();//测试对象打印
//		int circulateNum = 100000; //测试循环次数
//		
//		//测试Cell解析
//		for(int i=0;i<100000;i++){
//			CellGenerator cg = new CellGenerator();
//			byte[] data = cg.getData();
////			qt.parseObject(cg.pack, 5);
//			PacketTemplate pt = new PacketParser().parse(Constants.PROTOCOL_TYPE_CELL,data);
////			qt.parseObject(pt, 5);
//			if(!Arrays.equals(cg.pack.getFieldChain().get("Data").getValue(),pt.getFieldChain().get("Data").getValue())){
//				System.err.println("ERROR!!!");
//				break;
//			}
//		}
//		System.out.println("Test OK!!!");
//		
//		//测试SCP解析
//		for(int i=0;i<100000;i++){
//			SCPGenerator scpG = new SCPGenerator();
//			byte[] data = scpG.getData();
////			qt.parseObject(scpG.pack, 5);
//			PacketTemplate pt = new PacketParser().parse(Constants.PROTOCOL_TYPE_SCP,data);
////			qt.parseObject(pt, 5);
//			if(!Arrays.equals(scpG.pack.getFieldChain().get("CheckCode").getValue(),pt.getFieldChain().get("CheckCode").getValue())){
//				System.err.println("ERROR!!!");
//				break;
//			}
//		}
//		System.out.println("Test OK!!!");
//		
//		//测试SCP生成耗时（本机上运行平均每秒可生成2万多SCP）
//		SCPGenerator scpG = new SCPGenerator();
//		long start1 = System.currentTimeMillis();
//		for(int i=0;i<circulateNum;i++){
//			byte[] data = scpG.getData();
//		}
//		long end1 = System.currentTimeMillis();   
//		System.out.println("生成"+circulateNum+"个SCP用时：" + (end1 - start1)+"毫秒");
//	}
	
}
